package com.lleice.common.strategy;

import java.util.concurrent.TimeUnit;

import org.redisson.api.RLock;

/**
 * 分布式锁工具类
 * @author lizihao
 *
 */
public interface RedissonLocker {
	/**
	 * 根据key上锁(获取不了锁线程会一直block)
	 * @param lockKey
	 * @return
	 * @throws Exception
	 */
	RLock lock(String lockKey) throws Exception;
	/**
	 * 根据key上锁(带锁超时时间)(获取不了锁线程会一直block)
	 * @param lockKey
	 * @param timeout
	 * @return
	 * @throws Exception
	 */
    RLock lock(String lockKey, int timeout) throws Exception;
    /**
     * 根据key上锁(带锁超时时间,自定义时间单位)(获取不了锁线程会一直block)
     * @param lockKey
     * @param unit
     * @param timeout
     * @return
     * @throws Exception
     */
    RLock lock(String lockKey, TimeUnit unit, int timeout) throws Exception;
    /**
     * 尝试上锁,waitTime可以设置等待锁时间
     * @param lockKey
     * @param unit
     * @param waitTime
     * @param leaseTime
     * @return
     */
    boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime);
    /**
     * 解锁(需要同一个线程内)
     * @param lockKey
     * @throws Exception
     */
    void unlock(String lockKey) throws Exception;
    /**
     * 解锁(不需要同一个线程内)
     * @param lockKey
     * @throws Exception
     */
    void forceUnlock(String lockKey) throws Exception;
    /**
     * 解锁(需要同一个线程内)
     * @param lock
     * @throws Exception
     */
    void unlock(RLock lock) throws Exception;
}
